import axios, { AxiosResponse, AxiosRequestConfig } from 'axios';
import { message } from 'antd';
import qs from 'qs';
// 引入自己项目中的配置文件
// import { hrefLogin } from 'src/configs';

// 响应时间
axios.defaults.timeout = 300000; // 5 min
axios.defaults.headers.post['Content-Type'] = 'application/json';

// 取消请求操作
const allPendingRequestsRecord = [];
 const pending = {};
const removeAllPendingRequestsRecord = () => {
    allPendingRequestsRecord && allPendingRequestsRecord.forEach((func) => {
        // 取消请求（调用函数就是取消该请求）
        func('路由跳转了取消所有请求');
    });
    // 移除所有记录
    allPendingRequestsRecord.splice(0);
};

// 取消同一个重复的ajax请求
const removePending = (key, isRequest = false) => {
    if (pending[key] && isRequest) {
        pending[key]('取消重复请求');
    }
    delete pending[key];
};

// 取消所有请求的函数
export const getConfirmation = (mes = '', callback = () => {}) => {
    removeAllPendingRequestsRecord();
    callback();
};

// request interceptor
axios.interceptors.request.use(
    (config) => {
        // 在请求发送前执行一下取消操作，防止连续点击重复发送请求(例如连续点击2次按钮)
        let reqData = '';
        // 处理如url相同请求参数不同时上一个请求被屏蔽的情况
        if (config.method === 'get') {
            reqData = config.url + config.method + JSON.stringify(config.params);
        } else {
            reqData = config.url + config.method + JSON.stringify(config.data);
        }
        // 如果用户连续点击某个按钮会发起多个相同的请求，可以在这里进行拦截请求并取消上一个重复的请求
        removePending(reqData, true);
        // 设置请求的 cancelToken（设置后就能中途控制取消了）
        config.cancelToken = new axios.CancelToken((c) => {
            pending[reqData] = c;
            allPendingRequestsRecord.push(c);
        });

        // application/x-www-form-urlencoded
        if (config.resType === 'form') {
            config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
            config.data = qs.stringify(config.data);
            return config;
        }
        return config;
    },
    (error) => Promise.reject(error),
);

// response interceptor
axios.interceptors.response.use(
    (response) => {
        if (response.status >= 400) {
            // 没登录/过期/异常
            if (response.status === 401) {
                message.error('登录态过期，请重新登录');
                // ...写入自己的代码逻辑
                return;
            }
            message.error('网络连接异常');
            return Promise.reject(response);
        }

        return response;
    },
    (error) => {
        // 终结由于取消重复请求而引发的报错提示
        if (axios.isCancel(error)) {
            return new Promise(() => {});
        }
        if (error.response) {
            if (error.response.status === 401) {
                message.error('登录态过期，请重新登录');
                // ...写入自己的代码逻辑
            } else if (error.response.status === 403) {
                message.error('您尚无权限访问');
                // ...写入自己的代码逻辑
            } else if (error.response.status === 511) {
                message.error('您尚未登录，请登录');
                // ...写入自己的代码逻辑
            } else {
                message.error('网络连接异常');
            }
        }
        return Promise.reject(error);
    },
);

export default axios;


